package com.yuwei.common.event

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch

/**
 * 基于SharedFlow实现的全局事件总线，用于处理跨组件通信
 * 提供同步/异步事件发送和订阅功能 (Kotlin开发中，推荐使用)
 */
object ShareFlowBus {
    // 使用64个缓冲容量的共享流，避免快速连续发送事件导致丢失
    private val _sharedFlow = MutableSharedFlow<CustomEvent>(extraBufferCapacity = 64)
    
    // 对外暴露不可变的SharedFlow接口
    val sharedFlow: SharedFlow<CustomEvent> = _sharedFlow.asSharedFlow()

    /**
     * 同步发送事件（需在协程中调用）
     * @param event 待发送的事件对象
     */
    suspend fun sendEvent(event: CustomEvent) {
        _sharedFlow.emit(event)
    }

    /**
     * 异步发送事件（可在任意线程调用）
     * 在默认调度器启动新协程执行发送
     * @param event 待发送的事件对象
     */
    suspend fun sendAsyncEvent(event: CustomEvent) {
        CoroutineScope(Dispatchers.Default).launch {
            _sharedFlow.emit(event)
        }
    }

    /**
     * 事件订阅方法
     * 支持类型过滤和自动协程管理
     * @param T 事件类型
     * @param scope 订阅者的协程作用域
     * @param onEvent 事件回调处理
     */
    inline fun <reified T> subscribeEvent(scope: CoroutineScope, crossinline onEvent: (T) -> Unit) {
        sharedFlow.filterIsInstance<T>()
           .onEach { onEvent(it) }
           .launchIn(scope)
    }
    fun remove(){
        _sharedFlow.resetReplayCache()
    }

}